#include <stdio.h>
#include <stdlib.h>

/**
 * 声明了一个递归引用的链式结构，其结构指针全是空指针。
 * 初始化链表时即使用for循环给空指针和值赋值。
 * 链表头指针的含义仅表示指针指向链表类型的，而不必关心内部的细节。
 */
typedef struct linked_list_unit
{
	int ISBN;
	struct linked_list_unit *next;
} Linked_List;

// typedef union any
// {
//     int int_dat;
//     float float_dat;
//     char char_dat[100];
// } arr;

/**
 * Linked_List
 * 创建并初始化链表
 * @param int n
 * @param int arr[n]
 * @return Linked_List *
 */
Linked_List * Create_List(int n, int arr[n])
{
	// 创建一个像DNA复制酶一样的指针
	Linked_List * polymerase = (Linked_List *)malloc(sizeof(Linked_List));
	// 定义一个启动子，将复制酶放到启动子上
	Linked_List * promoter = polymerase;
	for (int i = 0; i < n; i++)
	{
		Linked_List * node = (Linked_List *)malloc(sizeof(Linked_List));
		node->ISBN = arr[i];
		polymerase->next = node;
		polymerase = polymerase->next;
	}
	// 最后，复制酶会指向终止位点，如果要双向链表的话，可以返回promoter作起点，ploymerase作终点
	return promoter;
}

/**
 * void
 * 遍历链表
 * @param Linked_List *
 * @param void (*)
 * @return
 */
void Iter_Linked_List(Linked_List * ploymerase, int (*)())
{
	ploymerase=ploymerase->next;
	while (ploymerase->next != NULL)
	{
		/* code */
	}
}

int main(void)
{
	int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
	Linked_List *array = Create_List(16, arr);  // 创建链表
	printf("%d\n", array->next->next->next->ISBN);
	// Iter_Linked_List(array, printf);
	// printf("%d\n", array->next->ISBN);		// 打印ISBN号
	return 0;
}
